import java.util.*;

/**
 * 判断数组中所有的数字是否只出现一次。给定一个数组array，判断数组 array 中是否所有的数字都只 出现过一次。
 * 例如，arr = {1, 2, 3}，输出 YES。又如，arr = {1, 2, 1}，输出 NO。约束时间复杂度为 O(n)。
 */
public class OnlyFindOne {

    public static boolean isOne(int[] array){
        int max = 0;
        int min = 0;

        // 获得最大值和最小值之间的差
        for (int i = 0; i < array.length; i++) {
            if (array[i] > max){
                max = array[i];
            }
            if (array[i] < min){
                min = array[i];
            }
        }
        int d = max - min;

        // 桶的初始化
        int bucketNum = array.length;
        List<LinkedList<Integer>> bucketList = new ArrayList<>(bucketNum);
        for (int i = 0; i < bucketNum; i++) {
            bucketList.add(new LinkedList<>());
        }
        // 将每个元素放入桶中
        for (int i = 0; i < array.length; i++) {
            int num = (array[i] - min) * (bucketNum - 1) / d;
            if (bucketList.get(num).size() > 0){
                return false;
            }
            bucketList.get(num).add(array[i]);
        }
        return true;
    }


    public static void main(String[] args) {
        int[] arr = {1,2,3,4};

        System.out.println(isOne(arr) ? "YES" : "NO");
    }
}
